package com.obelisco.vista.componentes;

import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.TooManyListenersException;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;

import tucana.echo2.app.FileUploadSelector;
import tucana.echo2.app.fileuploader.ProgressBar;
import tucana.echo2.app.fileuploader.UploadCallback;

import com.obelisco.vista.estilos.Styles;
import com.obelisco.vista.imagen.ByteArrayImageReference;
import com.obelisco.vista.plantillas.VentanaBase;
import com.obelisco.vista.plantillas.VentanaDialogoBase;
import com.obelisco.vista.plantillas.VentanaDialogoSimple;
import com.obelisco.vista.plantillas.VentanaTransaccionSimple;

//import net.sf.ehcache.util.PropertyUtil;
import nextapp.echo2.app.Alignment;
import nextapp.echo2.app.ApplicationInstance;
import nextapp.echo2.app.AwtImageReference;
import nextapp.echo2.app.Border;
import nextapp.echo2.app.Button;
import nextapp.echo2.app.Color;
import nextapp.echo2.app.Column;
import nextapp.echo2.app.Component;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.Grid;
import nextapp.echo2.app.ImageReference;
import nextapp.echo2.app.Insets;
import nextapp.echo2.app.Label;
import nextapp.echo2.app.ResourceImageReference;
import nextapp.echo2.app.StreamImageReference;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.filetransfer.UploadEvent;
import nextapp.echo2.app.filetransfer.UploadListener;
import nextapp.echo2.app.filetransfer.UploadSelect;
import nextapp.echo2.app.layout.ColumnLayoutData;
import echopointng.ContainerEx;
import echopointng.ExtentEx;
import echopointng.ImageMap;
import echopointng.image.ImageKit;

public class PaneSubirArchivo extends ContainerEx {

	private Component padreDialogoCargar;
	private PaneImagen paneImagen;
	private Button btnCargar;

	private int ancho =200;
	private int alto = 40;
	
	private int anchoDialogoCargar = 450;
	private int altoDialogoCargar = 400;
	
	private byte[] fileData;
	private String contentType = "";
	private long fileSize = 0;
	private String fileName ="";

	private Object objectBinding = null;
	private String propertyBinding = "";
	
	private boolean modificable = true;
	
	private Label nombreArchivo = new Label();

	public Label getNombreArchivo() {
		return nombreArchivo;
	}

	public void setNombreArchivo(Label nombreArchivo) {
		this.nombreArchivo = nombreArchivo;
	}

	public PaneSubirArchivo() {
		super();
		// Add design-time configured components.
		initComponents();
	}
	
	private SubirArchivoListener eventoSubirArchivo = new SubirArchivoListener() {

		public void subirArchivo(byte[] data, String contentType, String fileName, long size) {
			// TODO Auto-generated method stub
			setFileData(data, contentType, fileName);
		}
		
	};
	
	private void accionCargar(ActionEvent e) {
		//TODO Implement.
		DialogoSubirArchivo uploadDialog = new DialogoSubirArchivo("Cargar Archivo");		
		Component padre = this.getParent();
		if (padreDialogoCargar == null)
		{
			while(!(padre instanceof VentanaBase)) {
				padre = padre.getParent();			
			}
		}
		else
		{
			padre = padreDialogoCargar;
		}
		uploadDialog.mostrarDialogo(padre, anchoDialogoCargar, altoDialogoCargar);
		uploadDialog.addSubirArchivoListener(eventoSubirArchivo);
	}
	
	private void initComponents() {
		this.setWidth(new Extent(ancho, Extent.PX));
		this.setHeight(new Extent(alto, Extent.PX));
		this.setInsets(new Insets(new Extent(4, Extent.PX)));
		Column column1 = new Column();
		add(column1);
		
		paneImagen = new PaneImagen();
		nombreArchivo.setText("");
		column1.add(nombreArchivo);
		//column1.add(paneImagen);
		
		btnCargar = new Button();
		btnCargar.setText("Adjuntar Archivo");
		btnCargar.setWidth(new ExtentEx("50%"));
		btnCargar.setStyleName("Obelisco.Boton");
		ColumnLayoutData btnCargarLayoutData = new ColumnLayoutData();
		btnCargarLayoutData.setAlignment(new Alignment(Alignment.RIGHT,
				Alignment.TOP));
		btnCargar.setLayoutData(btnCargarLayoutData);
		btnCargar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				accionCargar(e);
			}
		});
		column1.add(btnCargar);
	}

	public int getAlto() {
		return alto;
	}

	public void setAlto(int alto) {
		this.alto = alto;
		this.setHeight(new Extent(alto, Extent.PX));
		this.paneImagen.setHeight(new Extent(alto, Extent.PX));
	}

	public int getAncho() {
		return ancho;
	}

	public void setAncho(int ancho) {
		this.ancho = ancho;
		this.setWidth(new Extent(ancho, Extent.PX));
		this.paneImagen.setWidth(new Extent(ancho, Extent.PX));
	}
	
	public byte[] getFileData() {
		return fileData;
	}

	public void setFileData(byte[] data, String contentType, String fileName) {

        this.fileData = data;
        this.contentType = contentType;
        this.fileName = fileName;
        if (objectBinding != null && (propertyBinding != null && !propertyBinding.equals(""))) {
        	
        	
        	try {
				PropertyUtils.setProperty(objectBinding, propertyBinding, data);
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        	
        	
        }
        
        paneImagen.setImagen(data,contentType);
        nombreArchivo.setText(fileName);
       
	}
	
	public void setFileData(byte[] data) {
		setFileData(data,"",fileName);
	}
	

	public String getContentType() {
		return contentType;
	}

	public void setContentType(String contentType) {
		this.contentType = contentType;
	}

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public long getFileSize() {
		return fileSize;
	}

	public void setFileSize(long imageSize) {
		this.fileSize = imageSize;
	}
	
	public void setBinding(Object objeto,String atributo) {
		
		 try {
			 this.objectBinding = objeto;
			 this.propertyBinding = atributo;
	
			 setFileData((byte[])PropertyUtils.getProperty(objeto, atributo));
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public boolean isModificable() {
		return modificable;
	}

	public void setModificable(boolean modificable) {
		this.modificable = modificable;
		btnCargar.setVisible(modificable);
	}

	public Component getPadreDialogoCargar() {
		return padreDialogoCargar;
	}

	public void setPadreDialogoCargar(Component padreDialogoCargar) {
		this.padreDialogoCargar = padreDialogoCargar;
	}
	
	
}

